package generador;

public class GeneradorDeRutinas {
	
	public static String getRutinasFijas() {
		StringBuilder sb = new StringBuilder();
		sb.append("writeCRLF proc near \n");
		sb.append("    push ax \n");
		sb.append("    mov al, 0Dh \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h      \n");
		sb.append("    mov al, 0Ah \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h      \n");
		sb.append("    pop ax \n");
		sb.append("    ret \n");
		sb.append("writeCRLF endp \n");
		sb.append("writeSTR proc near \n");
		sb.append("    push bp \n");
		sb.append("    mov bp, sp \n");
		sb.append("    push ax \n");
		sb.append("    push bx \n");
		sb.append("    push cx \n");
		sb.append("    push si \n");
		sb.append("    mov si, [bp+6]  ; a SI se le asigna el primer parametro (direccion) \n");
		sb.append("    mov cx, [bp+4]  ; a CX se le asigna el segundo parametro (cantidad de caracteres) \n");
		sb.append("    xor bx, bx \n");
		sb.append("loop:     \n");
		sb.append("    mov al, [si] \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h      \n");
		sb.append("    inc bx \n");
		sb.append("    inc si \n");
		sb.append("    cmp bx, cx \n");
		sb.append("    jne loop \n");
		sb.append("    pop si \n");
		sb.append("    pop cx \n");
		sb.append("    pop bx \n");
		sb.append("    pop ax \n");
		sb.append("    pop bp \n");
		sb.append("    ret 4 \n");
		sb.append("writeSTR endp \n");
		sb.append("writeNUM proc near \n");
		sb.append("    push bp \n");
		sb.append("    mov bp, sp \n");
		sb.append("    sub sp, 1        ; [bp-1] = signo (00h=positivo, 01h=negativo) \n");
		sb.append("    sub sp, 6        ; [bp-2] = espacio para imprimir (db 6 dup(?)) \n");
		sb.append("    push ax \n");
		sb.append("    push bx \n");
		sb.append("    push cx \n");
		sb.append("    push dx \n");
		sb.append("    push si \n");
		sb.append("    mov [bp-1], 00h \n");
		sb.append("    mov ax, [bp+4] \n");
		sb.append("    cmp ax, 0 \n");
		sb.append("    jge comenzar     ; Si no es negativo, comienza \n");
		sb.append("    neg ax           ; Realiza ax = -ax \n");
		sb.append("    mov [bp-1], 01h \n");
		sb.append("comenzar: \n");
		sb.append("    mov bx, 10 \n");
		sb.append("    mov cx, 0 \n");
		sb.append("    mov si, bp \n");
		sb.append("    sub si, 8 \n");
		sb.append("proxdiv: \n");
		sb.append("    dec si \n");
		sb.append("    xor dx, dx     \n");
		sb.append("    idiv bx \n");
		sb.append("    add dl, 48 \n");
		sb.append("    mov [si], dl \n");
		sb.append("    inc cx \n");
		sb.append("    cmp ax, 0 \n");
		sb.append("    jnz proxdiv \n");
		sb.append("    cmp [bp-1], 00h \n");
		sb.append("    jz mostrar \n");
		sb.append("    dec si \n");
		sb.append("    mov [si], '-' \n");
		sb.append("    inc cx \n");
		sb.append("mostrar:     \n");
		sb.append("    push si \n");
		sb.append("    push cx \n");
		sb.append("    call writeSTR \n");
		sb.append("    pop si \n");
		sb.append("    pop dx \n");
		sb.append("    pop cx \n");
		sb.append("    pop bx \n");
		sb.append("    pop ax \n");
		sb.append("    mov sp, bp    \n");
		sb.append("    pop bp \n");
		sb.append("    ret 2 \n");
		sb.append("writeNUM endp \n");
		sb.append("dig macro digbase \n");
		sb.append("    cmp al, digbase \n");
		sb.append("    jl inicioread \n");
		sb.append("    cmp al, '9' \n");
		sb.append("    jg inicioread \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h      \n");
		sb.append("    mov [bp-1], 03h \n");
		sb.append("    mov cl, al \n");
		sb.append("    sub cl, 48 \n");
		sb.append("    mov ax, si \n");
		sb.append("    mov bx, 000Ah \n");
		sb.append("    imul bx          ; AX = AX * 10 \n");
		sb.append("    add ax, cx       ; AX = AX + CX (digito) \n");
		sb.append("    mov si, ax \n");
		sb.append("endm \n");
		sb.append("writeBS macro \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h \n");
		sb.append("    mov al, ' ' \n");
		sb.append("    int 10h \n");
		sb.append("    mov al, 08h \n");
		sb.append("    int 10h      \n");
		sb.append("endm \n");
		sb.append("readln proc near \n");
		sb.append("    push bp \n");
		sb.append("    mov bp, sp \n");
		sb.append("    sub sp, 1        ; [bp-1] = estado (00h=inicio, 01h=solo 0, 02h=-, 03h=digitos) \n");
		sb.append("    sub sp, 1        ; [bp-2] = signo (00h=positivo, 01h=negativo) \n");
		sb.append("    push ax \n");
		sb.append("    push bx \n");
		sb.append("    push cx \n");
		sb.append("    push dx \n");
		sb.append("    push si \n");
		sb.append("    mov [bp-1], 00h \n");
		sb.append("    mov [bp-2], 00h \n");
		sb.append("    mov si, 0000h     ; valor \n");
		sb.append("    mov bx, 0 \n");
		sb.append("    mov cx, 0 \n");
		sb.append("inicioread: \n");
		sb.append("    mov ah, 0 \n");
		sb.append("    int 16h \n");
		sb.append("    cmp [bp-1], 00h \n");
		sb.append("    je estado0 \n");
		sb.append("    cmp [bp-1], 01h \n");
		sb.append("    je estado1 \n");
		sb.append("    cmp [bp-1], 02h \n");
		sb.append("    je estado2 \n");
		sb.append("    cmp [bp-1], 03h \n");
		sb.append("    je estado3 \n");
		sb.append("estado0:     \n");
		sb.append("    cmp al, 0Dh \n");
		sb.append("    je inicioread \n");
		sb.append("    cmp al, '0' \n");
		sb.append("    jne estado0a \n");
		sb.append("    mov [bp-1], 01h \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h      \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado0a:     \n");
		sb.append("    cmp al, '-' \n");
		sb.append("    jne estado0b \n");
		sb.append("    mov [bp-1], 02h \n");
		sb.append("    mov [bp-2], 01h \n");
		sb.append("    mov ah, 0Eh \n");
		sb.append("    int 10h      \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado0b: \n");
		sb.append("    dig '1' \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado1:     \n");
		sb.append("    cmp al, 0Dh \n");
		sb.append("    je finread \n");
		sb.append("    cmp al, 08h \n");
		sb.append("    jne inicioread \n");
		sb.append("    writeBS \n");
		sb.append("    mov [bp-1], 00h \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado2: \n");
		sb.append("    cmp al, 0Dh \n");
		sb.append("    je inicioread \n");
		sb.append("    cmp al, 08h \n");
		sb.append("    jne estado2a \n");
		sb.append("    writeBS \n");
		sb.append("    mov [bp-1], 00h \n");
		sb.append("    mov [bp-2], 00h \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado2a:     \n");
		sb.append("    dig '1' \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado3:     \n");
		sb.append("    cmp al, 0Dh \n");
		sb.append("    je finread \n");
		sb.append("    cmp al, 08h \n");
		sb.append("    jne estado3a \n");
		sb.append("    writeBS \n");
		sb.append("    mov ax, si \n");
		sb.append("    mov dx, 0 \n");
		sb.append("    mov bx, 000Ah \n");
		sb.append("    idiv bx          ; AX = AX / 10 \n");
		sb.append("    mov si, ax \n");
		sb.append("    cmp si, 0 \n");
		sb.append("    jne inicioread \n");
		sb.append("    cmp [bp-2], 00h \n");
		sb.append("    jne estado3bs1 \n");
		sb.append("    mov [bp-1], 00h \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado3bs1: \n");
		sb.append("    mov [bp-1], 02h \n");
		sb.append("    jmp inicioread \n");
		sb.append("estado3a:     \n");
		sb.append("    dig '0' \n");
		sb.append("    jmp inicioread \n");
		sb.append("finread: \n");
		sb.append("    cmp [bp-2], 00h \n");
		sb.append("    je finread2 \n");
		sb.append("    neg si \n");
		sb.append("finread2: \n");
		sb.append("    mov [bp+4], si \n");
		sb.append("    pop si \n");
		sb.append("    pop dx \n");
		sb.append("    pop cx \n");
		sb.append("    pop bx \n");
		sb.append("    pop ax \n");
		sb.append("    mov sp, bp    \n");
		sb.append("    pop bp     \n");
		sb.append("    ret \n");
		sb.append("readln endp \n");
		return sb.toString();
	}

}
